Aftereffects エクスプレッション
#After_Effects
基礎
基本的にはJSと一緒。何を返すかは感覚で見ていく。
特にindex(レイヤーの値)はよく使う。
位置のような2次元必要な場合は一つの値を[]で囲ってn,nのように配列にする。
ショートカットキーがある。eeと2回打つとそのレイヤーのエクスプレッションのある行だけ出してくれる。
文字を選択して渦巻きマークをクリックドラッグし、値などにつなげると、選択した部分をその値にしてくれる。(同じ数値を連動させたいときに便利)
エフェクトコントロールでスライダーを追加したらこれでドラッグすると早い。
effect("スライダー制御")("スライダー"); とエクスプレッションに書くとそのレイヤに適用されているスライダーの値を出してくれる。
ちなみにスライダー制御はカーブを値グラフで描けるので、アンカーポイントなどの通常グラフで動かせない操作の向上に使える。
以下個人的によく使うものまとめです。
Index系
seedRandom()など、シード値で固定したい時に使える。全部相対でCtrlDでの複製ごとにカウントアップしていく(つまり例えばrandomに具体の値を足した後に複製するとrandomのシードが変わってしまうのでまた調整し直しです)
code:js
Index レイヤーのカウント(複製すると元のレイヤーは1増えるのでちょっと扱いが面倒)
textIndex 文字のカウント
thisProperty.propertyGroup(1).propertyIndex シェイプレイヤーのオブジェクトのカウント
よく使う
code:js
textTotal 文字数
time 秒のカウント。1秒で1.0。フレーム数が設定によって変わる。
timeToFrames() フレーム数のカウント
value そのエフェクトに適用されていた元の値(これがないと数値を上書きするのでスライドできなくなる。どちらが便利かは都度考える)
selectorValue セレクタの元の値。
よく使うコピペ
code:js
偶数の文字数のときだけアニメーターを適用する(上下にバラバラに動かす、3次元に交互に浮かせるなど)
アニメーター/エクスプレッションセレクター/量に書いてください。
selectorValue * (textIndex % 2 == 0);
if(textIndex % 2 == 0){
selectorValue;
}else {
-selectorValue;
}
レイヤー毎に値が変わるが時間で変化しないランダムの設定。
seedRandom(index,true);
random();
個人的に一番ちょうどいい揺れ。
+noise(time/2)*20,noise(-time/2)*20
1フレームごとに値が切り替わる。Time Blendなどと一緒に使うと効果的。
if(timeToFrames() % 2 == 0){
1
}else{
0
}
もしくは
timeToFrames() % 2 == 0 ? 1 : 0 (いけないかも?試してほしいです)
複数レイヤーのイラストをZ軸ずらしてアニメーションさせる際、そのレイヤーの見かけの大きさを元の大きさに揃える。
scale * length(sub(position, thisComp.activeCamera.position)) / thisComp.activeCamera.zoom;
テキストレイヤーにJSONをそのまま入れて処理する場合、evalを噛ませる必要がある。以下はjsonという名前のテキストレイヤーにJSONを入れた場合のインプット。
code::js
var json = eval(thisComp.layer("json").text.sourceText);
テキストのreで指定した範囲の文字だけ別のフォントに変える。
code::js
var ran = [];
var re = /\u4E00-\u9FFF+/g;
while ((match = re.exec(text.sourceText.value)) !== null) {
ran.push([match.index, match0.length]);
}
for (i = 0; i < ran.length; i++) {
style = style.setFont("SourceHanSansJP-Medium", rani0, rani1);
}
style;
指数スケールというアニメーション補助機能が1Fごとにキーフレームを作ってしまうので、エクスプレッションで対応。
Zoom Lenz の加速 をちょっと自分の使いやすいように改造しているが素人にはわからない書記法があってうっかり消してるかもしれないのでもし動かなかったらリンク先を参照してほしいです。
code::js
k1 = 1;
k2 = k1 + 1;
if (key(k1).time <= time && key(k2).time > time) {
s1 = Math.max(key(k1).value0, 0.1);
s2 = Math.max(key(k2).value0, 0.1);
m = linear(time, key(k1).time, key(k2).time, 0, 1);
s = s1 * Math.exp(Math.log(s2 / s1) * m);
s, s;
} else {
value;
}
3次元テキストボックス
テキストレイヤーの下にシェイプレイヤーを追加、長方形パスを作って
code:js
サイズに
l=thisComp.layer(index-1);
l.sourceRectAtTime(time-l.inPoint,true).width,l.sourceRectAtTime(time-l.inPoint,true).height
位置に
l=thisComp.layer(index-1);
l.sourceRectAtTime(time-l.inPoint,true).width/2,l.sourceRectAtTime(time-l.inPoint,true).height/2
シェイプレイヤーはテキストレイヤーを親にしてください。
その他
https://battleaxe.tumblr.com/post/101945073972/maintain-stroke-weight-expression
シェイプレイヤーを拡大縮小した時に、線の幅を一定にするもの。